Spilled Secrets: Uncovering the Effects of Oil Spills on the North Sea Ecosystem¶

By: Ryan Boarman¶

Why oil spills are a concern:¶

Oil spills and their effects on the marine ecosystem is important and pose a serious threat to the environment, causing damage to marine habitats, wildlife, and biodiversity. Oil spills affect the interconnected ecosystems and the long-term health of the ocean.

Furthermore, oil spills have far-reaching consequences for society. They negatively impact the fishing, tourism, and public health sectors, leading to social conflicts, policy problems, and substantial financial burdens related to cleanup efforts and damage restoration. The issue also contributes to climate change, highlighting the need for sustainable management and stricter regulations.

Understanding the consequences of oil spills in the North Sea underlines the importance of striking a balance between economic growth, environmental conservation, and societal well-being. This project will provide valuable insights to guide policymakers and industry practices towards more sustainable management, monitoring, and conservation efforts, ultimately benefiting both human and marine life in the long run Oil Spill

Image Credit: Copernicus.eu

Prior research:¶

Numerous studies and initiatives have been conducted in the area of oil spills and their impact on the marine ecosystem. For instance, the Deepwater Horizon oil spill in 2010, one of the largest marine oil spills in history, led to extensive research on environmental impacts, effects on marine life, and response techniques. Reserach conducted during the Deepwater Horizon spill found severe lung diseases in dolphins due to the oil (Schwacke et al., 2014). The earlier Exxon Valdez oil spill in 1989 also prompted a surge in research on oil spill response, cleanup technologies, and environmental impact assessments.

International conventions and organizations, such as the International Maritime Organization (IMO) and the International Convention for the Prevention of Pollution from Ships (MARPOL), have established guidelines and regulations for preventing and responding to oil spills. The European Maritime Safety Agency (EMSA) and the Bonn Agreement have specifically focused on the North Sea region, working to prevent pollution from ships and offshore installations, and promoting cooperation between countries in case of incidents. Researchers have utilized satellite imagery, like Sentinel-1, to detect and monitor oil spills in the ocean. Organizations like SkyTruth use remote sensing techniques to track oil slicks and leaks from offshore platforms, providing valuable data for researchers and authorities. Ecological impact studies have examined the effects of oil spills on marine life, focusing on behavior, reproduction, survival, and population dynamics. These studies help in understanding the long-term consequences of oil spills on the marine ecosystem and inform future conservation efforts.

Despite the considerable work already done in this area, ongoing research is crucial for understanding the evolving nature of oil spills, improving response strategies, and addressing the long-term impacts on marine ecosystems.

Oil Spill

Image Credit: NBC News

Schwackeet al. (2014) Health of common bottlenose dolphins (Tursiops truncatus) in Barataria Bay, Louisiana, following the Deepwater Horizon oil spill. Environmental Science and Technology. 48(1): 93-103. doi: 10.1021/es403610f.

Methodlogy¶

Two main data sources were used for this exploratory analysis. Oil slick locations and species distribution maps.

Oil slicks were provided by SkyTruth. SkyTruth’s project Cerulean is an algorithm designed to detect oil slicks using Synthetic Aperture Radar (SAR) imagery. The algorithm scans Sentinel-1 SAR imagery with a focus on vertical polarization emitted and received (VV) for dark, smooth areas that indicate oil slicks. SAR imagery is useful for this purpose because of its ability to penetrate clouds and its 6-day temporal resolution, allowing for timely and frequent acquisition of images. Additionally, the contrast between the surface scattering of radar pulses off the small wavelets in clean water versus the smoother, darker appearance of oil slicks on radar images makes SAR imagery a useful tool for detecting oil spills (SkyTruth, 2023). I received oil slicks from 2020 in the North Sea, for this proof of concept and work flow I used only oil slicks from August 2020. I filtered the oil slick by category to only included "Infrastructure", "Vessel Old", "Recent", and "Adjacent.

Species distribution maps used in this analysis are from Waggitt et al. 2019. Waggit et al. generated monthly distribution maps of cetaceans and seabirds. A comprehensive survey of the North-East Atlantic was conducted between 1980 and 2018, collecting 2.68 million km of data. The data was collated and standardized and used to create distribution maps for 12 cetacean and 12 seabird species. These maps are at a resolution of 10 km and are at a monthly temporal scale.

Data was preprocessed and filtered to the study areas spatial and temporal resolution. For this initial analysis oil spills in the month of August and one species distribution in August, Harbour porpoise, was selected for the analysis. After data cleaning, zonal statistics were generated from each oil spill resulting in an average animal per km2 value for each oil spill.

SkyTruth, 2023, https://skytruth.org

Waggitt, J. J., Evans, P. G., Andrade, J., Banks, A. N., Boisseau, O., Bolton, M., ... & Hiddink, J. G. (2020). Distribution maps of cetacean and seabird populations in the North‐East Atlantic. Journal of Applied Ecology, 57(2), 253-269.

In [1]:
# Import libraries
import os

import calendar
import earthpy
import folium
import geopandas as gpd
from ipywidgets import interact, IntSlider, Dropdown
from ipywidgets import interact, widgets
import matplotlib.patches as mpatches
import matplotlib.pyplot as plt
from my_functions import download_oil_data, calculate_geometry_stats
import numpy as np
import pandas as pd
import plotly.express as px
import rasterio
import re
import requests
import rioxarray as rxr

# Set working directory to current directory
working_dir = os.getcwd()
os.chdir(working_dir)

Download data¶

Create function to download oil data¶

In [2]:
# def download_oil_data(urls, filenames):
#     """
#         Download data from a list of URLs and save it to local files.

#         Parameters:
#         urls (list of str): A list of URLs to download data from.
#         filenames (list of str): A list of filenames to save the downloaded data to.

#         Returns:
#         None
#     """
#     # Create the download folder if it doesn't exist
#     download_folder = 'data'
#     os.makedirs(download_folder, exist_ok=True)

#     for url, filename in zip(urls, filenames):
#         file_path = os.path.join(download_folder, filename)  # Build the file path

        
#         response = requests.get(url)

#         with open(file_path, "wb") as file:
#             file.write(response.content)

Oil Slick data download¶

In [3]:
# Data URLs
germany_url = ("https://github.com/ryanboarman/boarman-2023-capstone-project/"
               "releases/download/v1.0.0/germany_slicks.geojson")
finland_url = ("https://github.com/ryanboarman/boarman-2023-capstone-project/"
               "releases/download/v1.0.0/finland_slicks.geojson")
norway_url = ("https://github.com/ryanboarman/boarman-2023-capstone-project/"
              "releases/download/v1.0.0/norway_slicks.geojson")
sweden_url = ("https://github.com/ryanboarman/boarman-2023-capstone-project/"
              "releases/download/v1.0.0/sweden_slicks.geojson")
uk_url = ("https://github.com/ryanboarman/boarman-2023-capstone-project/"
          "releases/download/v1.0.0/uk_slicks.geojson")

# Data file names
germany_filename = "germany_slicks.geojson"
finland_filename = "finland_slicks.geojson"
norway_filename = "norway_slicks.geojson"
sweden_filename = "sweden_slicks.geojson"
uk_filename = "uk_slicks.geojson"

# Data lists
oil_urls = [germany_url, finland_url, norway_url, sweden_url, uk_url]
oil_filenames = [germany_filename, finland_filename,
                 norway_filename, sweden_filename, uk_filename]

# Download data
download_oil_data(oil_urls, oil_filenames)
print("All files downloaded.")
File 'germany_slicks.geojson' already exists. Skipping download.
File 'finland_slicks.geojson' already exists. Skipping download.
File 'norway_slicks.geojson' already exists. Skipping download.
File 'sweden_slicks.geojson' already exists. Skipping download.
File 'uk_slicks.geojson' already exists. Skipping download.
All files downloaded.

Species data¶

In [4]:
species_data_list = [

    {'MERP_EUR_RazorbillFitted_11_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_RazorbillFitted_11_EUROPE_UTM30N.asc',
     'MERP_EUR_SpermWhaleFitted_09_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_SpermWhaleFitted_09_EUROPE_UTM30N.asc',
     'MERP_EUR_MinkeWhaleFitted_02_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_MinkeWhaleFitted_02_EUROPE_UTM30N.asc',
     'MERP_EUR_NorthernFulmarFitted_02_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_NorthernFulmarFitted_02_EUROPE_UTM30N.asc',
     'MERP_EUR_ManxShearwaterFitted_12_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_ManxShearwaterFitted_12_EUROPE_UTM30N.asc',
     'MERP_EUR_FinWhaleFitted_10_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_FinWhaleFitted_10_EUROPE_UTM30N.asc',
     'MERP_EUR_EuropeanShagFitted_02_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_EuropeanShagFitted_02_EUROPE_UTM30N.asc',
     'MERP_EUR_BlackLeggedKittiwakeFitted_03_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_BlackLeggedKittiwakeFitted_03_EUROPE_UTM30N.asc',
     'MERP_EUR_StripedDolphinFitted_11_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_StripedDolphinFitted_11_EUROPE_UTM30N.asc',
     'MERP_EUR_WhitesidedDolphinFitted_01_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_WhitesidedDolphinFitted_01_EUROPE_UTM30N.asc',
     'MERP_EUR_LesserBlackBackedGullFitted_03_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_LesserBlackBackedGullFitted_03_EUROPE_UTM30N.asc',
     'MERP_EUR_PilotWhaleFitted_10_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_PilotWhaleFitted_10_EUROPE_UTM30N.asc',
     'MERP_EUR_RissosDolphinFitted_01_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_RissosDolphinFitted_01_EUROPE_UTM30N.asc',
     'MERP_EUR_WhitebeakedDolphinFitted_09_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_WhitebeakedDolphinFitted_09_EUROPE_UTM30N.asc',
     'MERP_EUR_GreatSkuaFitted_06_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_GreatSkuaFitted_06_EUROPE_UTM30N.asc',
     'MERP_EUR_KillerWhaleFitted_10_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_KillerWhaleFitted_10_EUROPE_UTM30N.asc',
     'MERP_EUR_AtlanticPuffinFitted_11_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_AtlanticPuffinFitted_11_EUROPE_UTM30N.asc',
     'MERP_EUR_HarbourPorpoiseFitted_05_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_HarbourPorpoiseFitted_05_EUROPE_UTM30N.asc',
     'MERP_EUR_KillerWhaleFitted_09_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_KillerWhaleFitted_09_EUROPE_UTM30N.asc',
     'MERP_EUR_WhitebeakedDolphinFitted_10_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_WhitebeakedDolphinFitted_10_EUROPE_UTM30N.asc',
     'MERP_EUR_MinkeWhaleFitted_07_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_MinkeWhaleFitted_07_EUROPE_UTM30N.asc',
     'MERP_EUR_NorthernFulmarFitted_07_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_NorthernFulmarFitted_07_EUROPE_UTM30N.asc',
     'MERP_EUR_AtlanticPuffinFitted_08_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_AtlanticPuffinFitted_08_EUROPE_UTM30N.asc',
     'MERP_EUR_EuropeanShagFitted_07_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_EuropeanShagFitted_07_EUROPE_UTM30N.asc',
     'MERP_EUR_StripedDolphinFitted_08_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_StripedDolphinFitted_08_EUROPE_UTM30N.asc',
     'MERP_EUR_CommonGuillemotFitted_12_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_CommonGuillemotFitted_12_EUROPE_UTM30N.asc',
     'MERP_EUR_EuropeanStormPetrelFitted_05_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_EuropeanStormPetrelFitted_05_EUROPE_UTM30N.asc',
     'MERP_EUR_BottlenoseDolphinFitted_05_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_BottlenoseDolphinFitted_05_EUROPE_UTM30N.asc',
     'MERP_EUR_PilotWhaleFitted_09_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_PilotWhaleFitted_09_EUROPE_UTM30N.asc',
     'MERP_EUR_LesserBlackBackedGullFitted_06_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_LesserBlackBackedGullFitted_06_EUROPE_UTM30N.asc',
     'MERP_EUR_WhitesidedDolphinFitted_04_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_WhitesidedDolphinFitted_04_EUROPE_UTM30N.asc',
     'MERP_EUR_RissosDolphinFitted_04_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_RissosDolphinFitted_04_EUROPE_UTM30N.asc',
     'MERP_EUR_BlackLeggedKittiwakeFitted_06_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_BlackLeggedKittiwakeFitted_06_EUROPE_UTM30N.asc',
     'MERP_EUR_FinWhaleFitted_09_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_FinWhaleFitted_09_EUROPE_UTM30N.asc',
     'MERP_EUR_RazorbillFitted_08_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_RazorbillFitted_08_EUROPE_UTM30N.asc',
     'MERP_EUR_SpermWhaleFitted_10_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_SpermWhaleFitted_10_EUROPE_UTM30N.asc',
     'MERP_EUR_GreatSkuaFitted_03_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_GreatSkuaFitted_03_EUROPE_UTM30N.asc',
     'MERP_EUR_RazorbillFitted_10_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_RazorbillFitted_10_EUROPE_UTM30N.asc',
     'MERP_EUR_NorthernFulmarFitted_03_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_NorthernFulmarFitted_03_EUROPE_UTM30N.asc',
     'MERP_EUR_MinkeWhaleFitted_03_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_MinkeWhaleFitted_03_EUROPE_UTM30N.asc',
     'MERP_EUR_SpermWhaleFitted_08_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_SpermWhaleFitted_08_EUROPE_UTM30N.asc',
     'MERP_EUR_BottlenoseDolphinFitted_01_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_BottlenoseDolphinFitted_01_EUROPE_UTM30N.asc',
     'MERP_EUR_HerringGullFitted_12_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_HerringGullFitted_12_EUROPE_UTM30N.asc',
     'MERP_EUR_EuropeanShagFitted_03_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_EuropeanShagFitted_03_EUROPE_UTM30N.asc',
     'MERP_EUR_FinWhaleFitted_11_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_FinWhaleFitted_11_EUROPE_UTM30N.asc',
     'MERP_EUR_EuropeanStormPetrelFitted_01_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_EuropeanStormPetrelFitted_01_EUROPE_UTM30N.asc',
     'MERP_EUR_BlackLeggedKittiwakeFitted_02_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_BlackLeggedKittiwakeFitted_02_EUROPE_UTM30N.asc',
     'MERP_EUR_StripedDolphinFitted_10_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_StripedDolphinFitted_10_EUROPE_UTM30N.asc',
     'MERP_EUR_LesserBlackBackedGullFitted_02_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_LesserBlackBackedGullFitted_02_EUROPE_UTM30N.asc',
     'MERP_EUR_CommonDolphinFitted_12_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_CommonDolphinFitted_12_EUROPE_UTM30N.asc',
     'MERP_EUR_PilotWhaleFitted_11_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_PilotWhaleFitted_11_EUROPE_UTM30N.asc',
     'MERP_EUR_KillerWhaleFitted_11_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_KillerWhaleFitted_11_EUROPE_UTM30N.asc',
     'MERP_EUR_WhitebeakedDolphinFitted_08_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_WhitebeakedDolphinFitted_08_EUROPE_UTM30N.asc',
     'MERP_EUR_GreatSkuaFitted_07_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_GreatSkuaFitted_07_EUROPE_UTM30N.asc',
     'MERP_EUR_NorthernGannetFitted_12_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_NorthernGannetFitted_12_EUROPE_UTM30N.asc',
     'MERP_EUR_HarbourPorpoiseFitted_04_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_HarbourPorpoiseFitted_04_EUROPE_UTM30N.asc',
     'MERP_EUR_AtlanticPuffinFitted_10_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_AtlanticPuffinFitted_10_EUROPE_UTM30N.asc',
     'MERP_EUR_WhitebeakedDolphinFitted_11_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_WhitebeakedDolphinFitted_11_EUROPE_UTM30N.asc',
     'MERP_EUR_KillerWhaleFitted_08_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_KillerWhaleFitted_08_EUROPE_UTM30N.asc',
     'MERP_EUR_AtlanticPuffinFitted_09_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_AtlanticPuffinFitted_09_EUROPE_UTM30N.asc',
     'MERP_EUR_NorthernFulmarFitted_06_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_NorthernFulmarFitted_06_EUROPE_UTM30N.asc',
     'MERP_EUR_MinkeWhaleFitted_06_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_MinkeWhaleFitted_06_EUROPE_UTM30N.asc',
     'MERP_EUR_StripedDolphinFitted_09_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_StripedDolphinFitted_09_EUROPE_UTM30N.asc',
     'MERP_EUR_EuropeanShagFitted_06_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_EuropeanShagFitted_06_EUROPE_UTM30N.asc',
     'MERP_EUR_EuropeanStormPetrelFitted_04_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_EuropeanStormPetrelFitted_04_EUROPE_UTM30N.asc',
     'MERP_EUR_PilotWhaleFitted_08_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_PilotWhaleFitted_08_EUROPE_UTM30N.asc',
     'MERP_EUR_BottlenoseDolphinFitted_04_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_BottlenoseDolphinFitted_04_EUROPE_UTM30N.asc',
     'MERP_EUR_WhitesidedDolphinFitted_05_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_WhitesidedDolphinFitted_05_EUROPE_UTM30N.asc',
     'MERP_EUR_LesserBlackBackedGullFitted_07_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_LesserBlackBackedGullFitted_07_EUROPE_UTM30N.asc',
     'MERP_EUR_RissosDolphinFitted_05_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_RissosDolphinFitted_05_EUROPE_UTM30N.asc',
     'MERP_EUR_FinWhaleFitted_08_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_FinWhaleFitted_08_EUROPE_UTM30N.asc',
     'MERP_EUR_BlackLeggedKittiwakeFitted_07_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_BlackLeggedKittiwakeFitted_07_EUROPE_UTM30N.asc',
     'MERP_EUR_RazorbillFitted_09_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_RazorbillFitted_09_EUROPE_UTM30N.asc',
     'MERP_EUR_HarbourPorpoiseFitted_01_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_HarbourPorpoiseFitted_01_EUROPE_UTM30N.asc',
     'MERP_EUR_SpermWhaleFitted_11_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_SpermWhaleFitted_11_EUROPE_UTM30N.asc',
     'MERP_EUR_GreatSkuaFitted_02_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_GreatSkuaFitted_02_EUROPE_UTM30N.asc',
     'MERP_EUR_ManxShearwaterFitted_10_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_ManxShearwaterFitted_10_EUROPE_UTM30N.asc',
     'MERP_EUR_BottlenoseDolphinFitted_02_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_BottlenoseDolphinFitted_02_EUROPE_UTM30N.asc',
     'MERP_EUR_EuropeanStormPetrelFitted_02_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_EuropeanStormPetrelFitted_02_EUROPE_UTM30N.asc',
     'MERP_EUR_HerringGullFitted_11_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_HerringGullFitted_11_EUROPE_UTM30N.asc',
     'MERP_EUR_FinWhaleFitted_12_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_FinWhaleFitted_12_EUROPE_UTM30N.asc',
     'MERP_EUR_BlackLeggedKittiwakeFitted_01_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_BlackLeggedKittiwakeFitted_01_EUROPE_UTM30N.asc',
     'MERP_EUR_CommonGuillemotFitted_09_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_CommonGuillemotFitted_09_EUROPE_UTM30N.asc',
     'MERP_EUR_CommonDolphinFitted_11_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_CommonDolphinFitted_11_EUROPE_UTM30N.asc',
     'MERP_EUR_RissosDolphinFitted_03_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_RissosDolphinFitted_03_EUROPE_UTM30N.asc',
     'MERP_EUR_PilotWhaleFitted_12_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_PilotWhaleFitted_12_EUROPE_UTM30N.asc',
     'MERP_EUR_LesserBlackBackedGullFitted_01_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_LesserBlackBackedGullFitted_01_EUROPE_UTM30N.asc',
     'MERP_EUR_WhitesidedDolphinFitted_03_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_WhitesidedDolphinFitted_03_EUROPE_UTM30N.asc',
     'MERP_EUR_KillerWhaleFitted_12_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_KillerWhaleFitted_12_EUROPE_UTM30N.asc',
     'MERP_EUR_GreatSkuaFitted_04_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_GreatSkuaFitted_04_EUROPE_UTM30N.asc',
     'MERP_EUR_NorthernGannetFitted_11_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_NorthernGannetFitted_11_EUROPE_UTM30N.asc',
     'MERP_EUR_HarbourPorpoiseFitted_07_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_HarbourPorpoiseFitted_07_EUROPE_UTM30N.asc',
     'MERP_EUR_NorthernGannetFitted_08_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_NorthernGannetFitted_08_EUROPE_UTM30N.asc',
     'MERP_EUR_WhitebeakedDolphinFitted_12_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_WhitebeakedDolphinFitted_12_EUROPE_UTM30N.asc',
     'MERP_EUR_NorthernFulmarFitted_05_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_NorthernFulmarFitted_05_EUROPE_UTM30N.asc',
     'MERP_EUR_MinkeWhaleFitted_05_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_MinkeWhaleFitted_05_EUROPE_UTM30N.asc',
     'MERP_EUR_EuropeanStormPetrelFitted_07_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_EuropeanStormPetrelFitted_07_EUROPE_UTM30N.asc',
     'MERP_EUR_CommonGuillemotFitted_10_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_CommonGuillemotFitted_10_EUROPE_UTM30N.asc',
     'MERP_EUR_EuropeanShagFitted_05_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_EuropeanShagFitted_05_EUROPE_UTM30N.asc',
     'MERP_EUR_BottlenoseDolphinFitted_07_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_BottlenoseDolphinFitted_07_EUROPE_UTM30N.asc',
     'MERP_EUR_CommonDolphinFitted_08_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_CommonDolphinFitted_08_EUROPE_UTM30N.asc',
     'MERP_EUR_RissosDolphinFitted_06_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_RissosDolphinFitted_06_EUROPE_UTM30N.asc',
     'MERP_EUR_WhitesidedDolphinFitted_06_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_WhitesidedDolphinFitted_06_EUROPE_UTM30N.asc',
     'MERP_EUR_LesserBlackBackedGullFitted_04_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_LesserBlackBackedGullFitted_04_EUROPE_UTM30N.asc',
     'MERP_EUR_BlackLeggedKittiwakeFitted_04_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_BlackLeggedKittiwakeFitted_04_EUROPE_UTM30N.asc',
     'MERP_EUR_HerringGullFitted_08_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_HerringGullFitted_08_EUROPE_UTM30N.asc',
     'MERP_EUR_SpermWhaleFitted_12_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_SpermWhaleFitted_12_EUROPE_UTM30N.asc',
     'MERP_EUR_HarbourPorpoiseFitted_02_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_HarbourPorpoiseFitted_02_EUROPE_UTM30N.asc',
     'MERP_EUR_ManxShearwaterFitted_09_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_ManxShearwaterFitted_09_EUROPE_UTM30N.asc',
     'MERP_EUR_GreatSkuaFitted_01_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_GreatSkuaFitted_01_EUROPE_UTM30N.asc',
     'MERP_EUR_MinkeWhaleFitted_01_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_MinkeWhaleFitted_01_EUROPE_UTM30N.asc',
     'MERP_EUR_NorthernFulmarFitted_01_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_NorthernFulmarFitted_01_EUROPE_UTM30N.asc',
     'MERP_EUR_RazorbillFitted_12_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_RazorbillFitted_12_EUROPE_UTM30N.asc',
     'MERP_EUR_ManxShearwaterFitted_11_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_ManxShearwaterFitted_11_EUROPE_UTM30N.asc',
     'MERP_EUR_BottlenoseDolphinFitted_03_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_BottlenoseDolphinFitted_03_EUROPE_UTM30N.asc',
     'MERP_EUR_EuropeanStormPetrelFitted_03_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_EuropeanStormPetrelFitted_03_EUROPE_UTM30N.asc',
     'MERP_EUR_HerringGullFitted_10_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_HerringGullFitted_10_EUROPE_UTM30N.asc',
     'MERP_EUR_EuropeanShagFitted_01_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_EuropeanShagFitted_01_EUROPE_UTM30N.asc',
     'MERP_EUR_CommonGuillemotFitted_08_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_CommonGuillemotFitted_08_EUROPE_UTM30N.asc',
     'MERP_EUR_StripedDolphinFitted_12_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_StripedDolphinFitted_12_EUROPE_UTM30N.asc',
     'MERP_EUR_RissosDolphinFitted_02_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_RissosDolphinFitted_02_EUROPE_UTM30N.asc',
     'MERP_EUR_CommonDolphinFitted_10_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_CommonDolphinFitted_10_EUROPE_UTM30N.asc',
     'MERP_EUR_WhitesidedDolphinFitted_02_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_WhitesidedDolphinFitted_02_EUROPE_UTM30N.asc',
     'MERP_EUR_NorthernGannetFitted_10_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_NorthernGannetFitted_10_EUROPE_UTM30N.asc',
     'MERP_EUR_GreatSkuaFitted_05_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_GreatSkuaFitted_05_EUROPE_UTM30N.asc',
     'MERP_EUR_AtlanticPuffinFitted_12_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_AtlanticPuffinFitted_12_EUROPE_UTM30N.asc',
     'MERP_EUR_HarbourPorpoiseFitted_06_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_HarbourPorpoiseFitted_06_EUROPE_UTM30N.asc',
     'MERP_EUR_NorthernGannetFitted_09_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_NorthernGannetFitted_09_EUROPE_UTM30N.asc',
     'MERP_EUR_MinkeWhaleFitted_04_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_MinkeWhaleFitted_04_EUROPE_UTM30N.asc',
     'MERP_EUR_NorthernFulmarFitted_04_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_NorthernFulmarFitted_04_EUROPE_UTM30N.asc',
     'MERP_EUR_EuropeanStormPetrelFitted_06_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_EuropeanStormPetrelFitted_06_EUROPE_UTM30N.asc',
     'MERP_EUR_EuropeanShagFitted_04_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_EuropeanShagFitted_04_EUROPE_UTM30N.asc',
     'MERP_EUR_CommonGuillemotFitted_11_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_CommonGuillemotFitted_11_EUROPE_UTM30N.asc',
     'MERP_EUR_CommonDolphinFitted_09_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_CommonDolphinFitted_09_EUROPE_UTM30N.asc',
     'MERP_EUR_BottlenoseDolphinFitted_06_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_BottlenoseDolphinFitted_06_EUROPE_UTM30N.asc',
     'MERP_EUR_RissosDolphinFitted_07_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_RissosDolphinFitted_07_EUROPE_UTM30N.asc',
     'MERP_EUR_LesserBlackBackedGullFitted_05_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_LesserBlackBackedGullFitted_05_EUROPE_UTM30N.asc',
     'MERP_EUR_WhitesidedDolphinFitted_07_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_WhitesidedDolphinFitted_07_EUROPE_UTM30N.asc',
     'MERP_EUR_HerringGullFitted_09_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_HerringGullFitted_09_EUROPE_UTM30N.asc',
     'MERP_EUR_BlackLeggedKittiwakeFitted_05_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_BlackLeggedKittiwakeFitted_05_EUROPE_UTM30N.asc',
     'MERP_EUR_HarbourPorpoiseFitted_03_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_HarbourPorpoiseFitted_03_EUROPE_UTM30N.asc',
     'MERP_EUR_ManxShearwaterFitted_08_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_ManxShearwaterFitted_08_EUROPE_UTM30N.asc',
     'MERP_EUR_BlackLeggedKittiwakeFitted_10_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_BlackLeggedKittiwakeFitted_10_EUROPE_UTM30N.asc',
     'MERP_EUR_StripedDolphinFitted_02_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_StripedDolphinFitted_02_EUROPE_UTM30N.asc',
     'MERP_EUR_LesserBlackBackedGullFitted_10_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_LesserBlackBackedGullFitted_10_EUROPE_UTM30N.asc',
     'MERP_EUR_WhitesidedDolphinFitted_12_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_WhitesidedDolphinFitted_12_EUROPE_UTM30N.asc',
     'MERP_EUR_RissosDolphinFitted_12_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_RissosDolphinFitted_12_EUROPE_UTM30N.asc',
     'MERP_EUR_PilotWhaleFitted_03_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_PilotWhaleFitted_03_EUROPE_UTM30N.asc',
     'MERP_EUR_KillerWhaleFitted_03_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_KillerWhaleFitted_03_EUROPE_UTM30N.asc',
     'MERP_EUR_SpermWhaleFitted_06_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_SpermWhaleFitted_06_EUROPE_UTM30N.asc',
     'MERP_EUR_AtlanticPuffinFitted_02_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_AtlanticPuffinFitted_02_EUROPE_UTM30N.asc',
     'MERP_EUR_RazorbillFitted_02_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_RazorbillFitted_02_EUROPE_UTM30N.asc',
     'MERP_EUR_NorthernFulmarFitted_11_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_NorthernFulmarFitted_11_EUROPE_UTM30N.asc',
     'MERP_EUR_MinkeWhaleFitted_11_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_MinkeWhaleFitted_11_EUROPE_UTM30N.asc',
     'MERP_EUR_WhitebeakedDolphinFitted_06_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_WhitebeakedDolphinFitted_06_EUROPE_UTM30N.asc',
     'MERP_EUR_GreatSkuaFitted_09_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_GreatSkuaFitted_09_EUROPE_UTM30N.asc',
     'MERP_EUR_ManxShearwaterFitted_01_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_ManxShearwaterFitted_01_EUROPE_UTM30N.asc',
     'MERP_EUR_CommonGuillemotFitted_04_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_CommonGuillemotFitted_04_EUROPE_UTM30N.asc',
     'MERP_EUR_FinWhaleFitted_03_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_FinWhaleFitted_03_EUROPE_UTM30N.asc',
     'MERP_EUR_EuropeanShagFitted_11_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_EuropeanShagFitted_11_EUROPE_UTM30N.asc',
     'MERP_EUR_PilotWhaleFitted_06_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_PilotWhaleFitted_06_EUROPE_UTM30N.asc',
     'MERP_EUR_CommonDolphinFitted_05_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_CommonDolphinFitted_05_EUROPE_UTM30N.asc',
     'MERP_EUR_EuropeanShagFitted_08_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_EuropeanShagFitted_08_EUROPE_UTM30N.asc',
     'MERP_EUR_StripedDolphinFitted_07_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_StripedDolphinFitted_07_EUROPE_UTM30N.asc',
     'MERP_EUR_NorthernFulmarFitted_08_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_NorthernFulmarFitted_08_EUROPE_UTM30N.asc',
     'MERP_EUR_MinkeWhaleFitted_08_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_MinkeWhaleFitted_08_EUROPE_UTM30N.asc',
     'MERP_EUR_SpermWhaleFitted_03_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_SpermWhaleFitted_03_EUROPE_UTM30N.asc',
     'MERP_EUR_AtlanticPuffinFitted_07_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_AtlanticPuffinFitted_07_EUROPE_UTM30N.asc',
     'MERP_EUR_GreatSkuaFitted_10_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_GreatSkuaFitted_10_EUROPE_UTM30N.asc',
     'MERP_EUR_NorthernGannetFitted_05_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_NorthernGannetFitted_05_EUROPE_UTM30N.asc',
     'MERP_EUR_KillerWhaleFitted_06_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_KillerWhaleFitted_06_EUROPE_UTM30N.asc',
     'MERP_EUR_WhitebeakedDolphinFitted_03_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_WhitebeakedDolphinFitted_03_EUROPE_UTM30N.asc',
     'MERP_EUR_ManxShearwaterFitted_04_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_ManxShearwaterFitted_04_EUROPE_UTM30N.asc',
     'MERP_EUR_RazorbillFitted_07_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_RazorbillFitted_07_EUROPE_UTM30N.asc',
     'MERP_EUR_HerringGullFitted_05_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_HerringGullFitted_05_EUROPE_UTM30N.asc',
     'MERP_EUR_CommonGuillemotFitted_01_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_CommonGuillemotFitted_01_EUROPE_UTM30N.asc',
     'MERP_EUR_FinWhaleFitted_06_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_FinWhaleFitted_06_EUROPE_UTM30N.asc',
     'MERP_EUR_BlackLeggedKittiwakeFitted_09_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_BlackLeggedKittiwakeFitted_09_EUROPE_UTM30N.asc',
     'MERP_EUR_LesserBlackBackedGullFitted_09_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_LesserBlackBackedGullFitted_09_EUROPE_UTM30N.asc',
     'MERP_EUR_BlackLeggedKittiwakeFitted_11_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_BlackLeggedKittiwakeFitted_11_EUROPE_UTM30N.asc',
     'MERP_EUR_StripedDolphinFitted_03_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_StripedDolphinFitted_03_EUROPE_UTM30N.asc',
     'MERP_EUR_LesserBlackBackedGullFitted_11_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_LesserBlackBackedGullFitted_11_EUROPE_UTM30N.asc',
     'MERP_EUR_PilotWhaleFitted_02_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_PilotWhaleFitted_02_EUROPE_UTM30N.asc',
     'MERP_EUR_CommonDolphinFitted_01_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_CommonDolphinFitted_01_EUROPE_UTM30N.asc',
     'MERP_EUR_NorthernGannetFitted_01_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_NorthernGannetFitted_01_EUROPE_UTM30N.asc',
     'MERP_EUR_KillerWhaleFitted_02_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_KillerWhaleFitted_02_EUROPE_UTM30N.asc',
     'MERP_EUR_AtlanticPuffinFitted_03_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_AtlanticPuffinFitted_03_EUROPE_UTM30N.asc',
     'MERP_EUR_SpermWhaleFitted_07_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_SpermWhaleFitted_07_EUROPE_UTM30N.asc',
     'MERP_EUR_RazorbillFitted_03_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_RazorbillFitted_03_EUROPE_UTM30N.asc',
     'MERP_EUR_MinkeWhaleFitted_10_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_MinkeWhaleFitted_10_EUROPE_UTM30N.asc',
     'MERP_EUR_NorthernFulmarFitted_10_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_NorthernFulmarFitted_10_EUROPE_UTM30N.asc',
     'MERP_EUR_WhitebeakedDolphinFitted_07_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_WhitebeakedDolphinFitted_07_EUROPE_UTM30N.asc',
     'MERP_EUR_GreatSkuaFitted_08_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_GreatSkuaFitted_08_EUROPE_UTM30N.asc',
     'MERP_EUR_BottlenoseDolphinFitted_12_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_BottlenoseDolphinFitted_12_EUROPE_UTM30N.asc',
     'MERP_EUR_HerringGullFitted_01_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_HerringGullFitted_01_EUROPE_UTM30N.asc',
     'MERP_EUR_EuropeanShagFitted_10_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_EuropeanShagFitted_10_EUROPE_UTM30N.asc',
     'MERP_EUR_FinWhaleFitted_02_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_FinWhaleFitted_02_EUROPE_UTM30N.asc',
     'MERP_EUR_CommonGuillemotFitted_05_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_CommonGuillemotFitted_05_EUROPE_UTM30N.asc',
     'MERP_EUR_EuropeanStormPetrelFitted_12_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_EuropeanStormPetrelFitted_12_EUROPE_UTM30N.asc',
     'MERP_EUR_AtlanticPuffinFitted_01_EUROPE_UTM30N.asc.aux.xml': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_AtlanticPuffinFitted_01_EUROPE_UTM30N.asc.aux.xml',
     'MERP_EUR_CommonDolphinFitted_04_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_CommonDolphinFitted_04_EUROPE_UTM30N.asc',
     'MERP_EUR_PilotWhaleFitted_07_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_PilotWhaleFitted_07_EUROPE_UTM30N.asc',
     'MERP_EUR_StripedDolphinFitted_06_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_StripedDolphinFitted_06_EUROPE_UTM30N.asc',
     'MERP_EUR_EuropeanShagFitted_09_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_EuropeanShagFitted_09_EUROPE_UTM30N.asc',
     'MERP_EUR_AtlanticPuffinFitted_06_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_AtlanticPuffinFitted_06_EUROPE_UTM30N.asc',
     'MERP_EUR_HarbourPorpoiseFitted_12_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_HarbourPorpoiseFitted_12_EUROPE_UTM30N.asc',
     'MERP_EUR_SpermWhaleFitted_02_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_SpermWhaleFitted_02_EUROPE_UTM30N.asc',
     'MERP_EUR_MinkeWhaleFitted_09_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_MinkeWhaleFitted_09_EUROPE_UTM30N.asc',
     'MERP_EUR_NorthernFulmarFitted_09_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_NorthernFulmarFitted_09_EUROPE_UTM30N.asc',
     'MERP_EUR_KillerWhaleFitted_07_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_KillerWhaleFitted_07_EUROPE_UTM30N.asc',
     'MERP_EUR_NorthernGannetFitted_04_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_NorthernGannetFitted_04_EUROPE_UTM30N.asc',
     'MERP_EUR_GreatSkuaFitted_11_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_GreatSkuaFitted_11_EUROPE_UTM30N.asc',
     'MERP_EUR_WhitebeakedDolphinFitted_02_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_WhitebeakedDolphinFitted_02_EUROPE_UTM30N.asc',
     'MERP_EUR_ManxShearwaterFitted_05_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_ManxShearwaterFitted_05_EUROPE_UTM30N.asc',
     'MERP_EUR_RazorbillFitted_06_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_RazorbillFitted_06_EUROPE_UTM30N.asc',
     'MERP_EUR_BlackLeggedKittiwakeFitted_08_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_BlackLeggedKittiwakeFitted_08_EUROPE_UTM30N.asc',
     'MERP_EUR_FinWhaleFitted_07_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_FinWhaleFitted_07_EUROPE_UTM30N.asc',
     'MERP_EUR_HerringGullFitted_04_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_HerringGullFitted_04_EUROPE_UTM30N.asc',
     'MERP_EUR_LesserBlackBackedGullFitted_08_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_LesserBlackBackedGullFitted_08_EUROPE_UTM30N.asc',
     'MERP_EUR_BlackLeggedKittiwakeFitted_12_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_BlackLeggedKittiwakeFitted_12_EUROPE_UTM30N.asc',
     'MERP_EUR_PilotWhaleFitted_01_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_PilotWhaleFitted_01_EUROPE_UTM30N.asc',
     'MERP_EUR_CommonDolphinFitted_02_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_CommonDolphinFitted_02_EUROPE_UTM30N.asc',
     'MERP_EUR_RissosDolphinFitted_10_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_RissosDolphinFitted_10_EUROPE_UTM30N.asc',
     'MERP_EUR_WhitesidedDolphinFitted_10_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_WhitesidedDolphinFitted_10_EUROPE_UTM30N.asc',
     'MERP_EUR_LesserBlackBackedGullFitted_12_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_LesserBlackBackedGullFitted_12_EUROPE_UTM30N.asc',
     'MERP_EUR_NorthernGannetFitted_02_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_NorthernGannetFitted_02_EUROPE_UTM30N.asc',
     'MERP_EUR_KillerWhaleFitted_01_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_KillerWhaleFitted_01_EUROPE_UTM30N.asc',
     'MERP_EUR_SpermWhaleFitted_04_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_SpermWhaleFitted_04_EUROPE_UTM30N.asc',
     'MERP_EUR_HarbourPorpoiseFitted_08_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_HarbourPorpoiseFitted_08_EUROPE_UTM30N.asc',
     'MERP_EUR_ManxShearwaterFitted_03_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_ManxShearwaterFitted_03_EUROPE_UTM30N.asc',
     'MERP_EUR_WhitebeakedDolphinFitted_04_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_WhitebeakedDolphinFitted_04_EUROPE_UTM30N.asc',
     'MERP_EUR_BottlenoseDolphinFitted_11_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_BottlenoseDolphinFitted_11_EUROPE_UTM30N.asc',
     'MERP_EUR_EuropeanStormPetrelFitted_11_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_EuropeanStormPetrelFitted_11_EUROPE_UTM30N.asc',
     'MERP_EUR_HerringGullFitted_02_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_HerringGullFitted_02_EUROPE_UTM30N.asc',
     'MERP_EUR_FinWhaleFitted_01_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_FinWhaleFitted_01_EUROPE_UTM30N.asc',
     'MERP_EUR_CommonGuillemotFitted_06_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_CommonGuillemotFitted_06_EUROPE_UTM30N.asc',
     'MERP_EUR_BottlenoseDolphinFitted_08_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_BottlenoseDolphinFitted_08_EUROPE_UTM30N.asc',
     'MERP_EUR_CommonDolphinFitted_07_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_CommonDolphinFitted_07_EUROPE_UTM30N.asc',
     'MERP_EUR_PilotWhaleFitted_04_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_PilotWhaleFitted_04_EUROPE_UTM30N.asc',
     'MERP_EUR_EuropeanStormPetrelFitted_08_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_EuropeanStormPetrelFitted_08_EUROPE_UTM30N.asc',
     'MERP_EUR_StripedDolphinFitted_05_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_StripedDolphinFitted_05_EUROPE_UTM30N.asc',
     'MERP_EUR_AtlanticPuffinFitted_05_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_AtlanticPuffinFitted_05_EUROPE_UTM30N.asc',
     'MERP_EUR_SpermWhaleFitted_01_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_SpermWhaleFitted_01_EUROPE_UTM30N.asc',
     'MERP_EUR_HarbourPorpoiseFitted_11_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_HarbourPorpoiseFitted_11_EUROPE_UTM30N.asc',
     'MERP_EUR_KillerWhaleFitted_04_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_KillerWhaleFitted_04_EUROPE_UTM30N.asc',
     'MERP_EUR_NorthernGannetFitted_07_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_NorthernGannetFitted_07_EUROPE_UTM30N.asc',
     'MERP_EUR_GreatSkuaFitted_12_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_GreatSkuaFitted_12_EUROPE_UTM30N.asc',
     'MERP_EUR_ManxShearwaterFitted_06_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_ManxShearwaterFitted_06_EUROPE_UTM30N.asc',
     'MERP_EUR_WhitebeakedDolphinFitted_01_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_WhitebeakedDolphinFitted_01_EUROPE_UTM30N.asc',
     'MERP_EUR_RazorbillFitted_05_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_RazorbillFitted_05_EUROPE_UTM30N.asc',
     'MERP_EUR_FinWhaleFitted_04_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_FinWhaleFitted_04_EUROPE_UTM30N.asc',
     'MERP_EUR_CommonGuillemotFitted_03_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_CommonGuillemotFitted_03_EUROPE_UTM30N.asc',
     'MERP_EUR_HerringGullFitted_07_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_HerringGullFitted_07_EUROPE_UTM30N.asc',
     'MERP_EUR_RissosDolphinFitted_09_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_RissosDolphinFitted_09_EUROPE_UTM30N.asc',
     'MERP_EUR_WhitesidedDolphinFitted_09_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_WhitesidedDolphinFitted_09_EUROPE_UTM30N.asc',
     'MERP_EUR_StripedDolphinFitted_01_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_StripedDolphinFitted_01_EUROPE_UTM30N.asc',
     'MERP_EUR_RissosDolphinFitted_11_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_RissosDolphinFitted_11_EUROPE_UTM30N.asc',
     'MERP_EUR_CommonDolphinFitted_03_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_CommonDolphinFitted_03_EUROPE_UTM30N.asc',
     'MERP_EUR_WhitesidedDolphinFitted_11_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_WhitesidedDolphinFitted_11_EUROPE_UTM30N.asc',
     'MERP_EUR_NorthernGannetFitted_03_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_NorthernGannetFitted_03_EUROPE_UTM30N.asc',
     'MERP_EUR_SpermWhaleFitted_05_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_SpermWhaleFitted_05_EUROPE_UTM30N.asc',
     'MERP_EUR_AtlanticPuffinFitted_01_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_AtlanticPuffinFitted_01_EUROPE_UTM30N.asc',
     'MERP_EUR_HarbourPorpoiseFitted_09_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_HarbourPorpoiseFitted_09_EUROPE_UTM30N.asc',
     'MERP_EUR_NorthernFulmarFitted_12_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_NorthernFulmarFitted_12_EUROPE_UTM30N.asc',
     'MERP_EUR_MinkeWhaleFitted_12_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_MinkeWhaleFitted_12_EUROPE_UTM30N.asc',
     'MERP_EUR_RazorbillFitted_01_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_RazorbillFitted_01_EUROPE_UTM30N.asc',
     'MERP_EUR_ManxShearwaterFitted_02_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_ManxShearwaterFitted_02_EUROPE_UTM30N.asc',
     'MERP_EUR_WhitebeakedDolphinFitted_05_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_WhitebeakedDolphinFitted_05_EUROPE_UTM30N.asc',
     'MERP_EUR_BottlenoseDolphinFitted_10_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_BottlenoseDolphinFitted_10_EUROPE_UTM30N.asc',
     'MERP_EUR_EuropeanStormPetrelFitted_10_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_EuropeanStormPetrelFitted_10_EUROPE_UTM30N.asc',
     'MERP_EUR_CommonGuillemotFitted_07_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_CommonGuillemotFitted_07_EUROPE_UTM30N.asc',
     'MERP_EUR_HerringGullFitted_03_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_HerringGullFitted_03_EUROPE_UTM30N.asc',
     'MERP_EUR_EuropeanShagFitted_12_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_EuropeanShagFitted_12_EUROPE_UTM30N.asc',
     'MERP_EUR_PilotWhaleFitted_05_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_PilotWhaleFitted_05_EUROPE_UTM30N.asc',
     'MERP_EUR_CommonDolphinFitted_06_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_CommonDolphinFitted_06_EUROPE_UTM30N.asc',
     'MERP_EUR_BottlenoseDolphinFitted_09_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_BottlenoseDolphinFitted_09_EUROPE_UTM30N.asc',
     'MERP_EUR_EuropeanStormPetrelFitted_09_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_EuropeanStormPetrelFitted_09_EUROPE_UTM30N.asc',
     'MERP_EUR_StripedDolphinFitted_04_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_StripedDolphinFitted_04_EUROPE_UTM30N.asc',
     'MERP_EUR_HarbourPorpoiseFitted_10_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_HarbourPorpoiseFitted_10_EUROPE_UTM30N.asc',
     'MERP_EUR_AtlanticPuffinFitted_04_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_AtlanticPuffinFitted_04_EUROPE_UTM30N.asc',
     'MERP_EUR_NorthernGannetFitted_06_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_NorthernGannetFitted_06_EUROPE_UTM30N.asc',
     'MERP_EUR_KillerWhaleFitted_05_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_KillerWhaleFitted_05_EUROPE_UTM30N.asc',
     'MERP_EUR_ManxShearwaterFitted_07_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_ManxShearwaterFitted_07_EUROPE_UTM30N.asc',
     'MERP_EUR_RazorbillFitted_04_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_RazorbillFitted_04_EUROPE_UTM30N.asc',
     'MERP_EUR_HerringGullFitted_06_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_HerringGullFitted_06_EUROPE_UTM30N.asc',
     'MERP_EUR_CommonGuillemotFitted_02_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_CommonGuillemotFitted_02_EUROPE_UTM30N.asc',
     'MERP_EUR_FinWhaleFitted_05_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_FinWhaleFitted_05_EUROPE_UTM30N.asc',
     'MERP_EUR_RissosDolphinFitted_08_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_RissosDolphinFitted_08_EUROPE_UTM30N.asc',
     'MERP_EUR_WhitesidedDolphinFitted_08_EUROPE_UTM30N.asc': 'https://github.com/ryanboarman/oil-slick-analysis/releases/download/v1.0.0/MERP_EUR_WhitesidedDolphinFitted_08_EUROPE_UTM30N.asc'}]

Species data download¶

In [5]:
# Create the download folder if it doesn't exist
download_folder = 'data'
os.makedirs(download_folder, exist_ok=True)

for species_data in species_data_list:
    for file_name, url in species_data.items():
        file_path = os.path.join(download_folder, file_name)

        # Check if the file already exists in the download folder
        if os.path.isfile(file_path):

            continue

        response = requests.get(url)

        with open(file_path, 'wb') as file:
            file.write(response.content)


print("All files downloaded.")
All files downloaded.

North Sea Species Distributions by Month¶

Preprocess species data¶

In [6]:
# Define the directory containing the .asc files
# directory = '/Users/ryanboarman/Documents/WORK/2023/skytruth/data/ASCII/Fitted'

directory= os.path.join(working_dir, "data")

# Create an empty dictionary to store the data
data_dict = {}

# Loop through each file in the directory
for filename in os.listdir(directory):

    # Check if the file is an .asc file
    if filename.endswith('.asc'):

        # Construct the full file path
        file_path = os.path.join(directory, filename)

        # Read in the file using xarray
        data = rxr.open_rasterio(file_path)

        # Set CRS to 32630
        data = data.rio.set_crs("EPSG:32630")

        # Replace -9999 with nan
        data_no_nan = data.where(data != -9999)

        # Set CRS to 32630 again (if needed, you've set it before so it might not be necessary to set it again)
        data_no_nan = data_no_nan.rio.set_crs("EPSG:32630")

       # Extract the filename without the extension
        base_filename = os.path.splitext(filename)[0]

        # Remove the "MERP_EUR_" prefix from the filename
        key = base_filename.replace("MERP_EUR_", "")
        # Remove the "Fitted" word from the key
        key = key.replace("Fitted", "")
        # Remove the "_EUROPE_UTM30N" suffix from the filename
        key = key.replace("_EUROPE_UTM30N", "")

        # Split the base filename to extract the species ID and month
        species_id, month = key.split("_")

        # Define the key using the {species_id}_{month} format
        key = f"{species_id}_{month}"

        # Store the data in the dictionary using the key
        data_dict[key] = data_no_nan

Interactive Map of all Species by Month¶

In [7]:
# Create a slider widget for the month
month_slider = IntSlider(min=1, max=12, value=1, description='Month')

# Get the available species IDs from the data_dict keys
available_species_ids = sorted(
    list(set([k.split("_")[0] for k in data_dict.keys()])))

# Create a dropdown widget for the species ID
species_dropdown = Dropdown(
    options=available_species_ids, description='Species ID')

# Create an interactive plot using the widgets


@interact(species_id=species_dropdown, month=month_slider)
def plot_data(species_id, month):
    # Convert month to a zero-padded string (e.g., '01', '02', ..., '12')
    month_str = str(month).zfill(2)

    # Construct the key based on the species ID and month
    key = f"{species_id}_{month_str}"

    # Retrieve the data from the data_dict using the key
    data = data_dict[key]

    # Map the month number to the corresponding month name
    month_name = calendar.month_name[int(month)]

    # Filter the data_dict to get the data for the specific species ID
    species_data = [v for k, v in data_dict.items()
                    if k.startswith(species_id)]

    # Calculate the minimum and maximum values for the specific species across all plots
    min_val = np.nanmin(species_data)
    max_val = np.nanmax(species_data)

    # Plot the data with automatic minimum and maximum values
    fig, ax = plt.subplots(figsize=(8, 8))
    ax.set_title(f"{species_id}\n{month_name} Distribution")
    shw = ax.imshow(data[0], vmin=min_val, vmax=max_val)
    bar = plt.colorbar(shw)
    plt.xlabel('')
    plt.ylabel('')
    bar.set_label('Animal Density (animal/km2)')
    ax.set_xticklabels([])
    ax.set_yticklabels([])
    plt.show()
interactive(children=(Dropdown(description='Species ID', options=('AtlanticPuffin', 'BlackLeggedKittiwake', 'B…

The figure shows animal density (animal/km2) in the north sea. Yellow regions highlight higher density regions while dark blue shows low density. Distributions are normalized by species min and max value over the year.

Oil Slicks¶

Preprocess oil slick data¶

In [8]:
# Set oil slick paths for each country
germany_path = os.path.join(working_dir, "data", "germany_slicks.geojson")
finland_path = os.path.join(working_dir, "data", "finland_slicks.geojson")
norway_path = os.path.join(working_dir, "data", "norway_slicks.geojson")
sweden_path = os.path.join(working_dir, "data", "sweden_slicks.geojson")
uk_path = os.path.join(working_dir, "data", "uk_slicks.geojson")

# Read in each oil slick to gdf
germany_gdf = gpd.read_file(germany_path)
finland_gdf = gpd.read_file(finland_path)
norway_gdf = gpd.read_file(norway_path)
sweden_gdf = gpd.read_file(sweden_path)
uk_gdf = gpd.read_file(uk_path)

# Convert the datetime fields to strings
germany_gdf['grd__starttime'] = germany_gdf['grd__starttime'].astype(str)
finland_gdf['grd__starttime'] = finland_gdf['grd__starttime'].astype(str)
norway_gdf['grd__starttime'] = norway_gdf['grd__starttime'].astype(str)
sweden_gdf['grd__starttime'] = sweden_gdf['grd__starttime'].astype(str)
uk_gdf['grd__starttime'] = uk_gdf['grd__starttime'].astype(str)

# Concatenate the GeoDataFrames
all_countries_gdf = pd.concat(
    [germany_gdf,
     finland_gdf,
     norway_gdf,
     sweden_gdf,
     uk_gdf], ignore_index=True)

# Replace "NULL" values with NaN
all_countries_gdf['slick__class_int'] = (all_countries_gdf['slick__class_int']
                                         .replace('NULL', np.nan))
# Replace NaN values with -999
all_countries_gdf['slick__class_int'] = (all_countries_gdf['slick__class_int']
                                         .fillna(-999))
# Convert column slick__class_int to int
all_countries_gdf['slick__class_int'] = (all_countries_gdf['slick__class_int']
                                         .astype(int))
# Select oil slick category 4,6,18,19
all_countries_gdf_allcat = (
    all_countries_gdf[all_countries_gdf['slick__class_int'].isin([
        4, 6, 18, 19])])

# Define the target CRS
crs_target = "EPSG:32630"

# Transform the GeoDataFrame to the target CRS
all_countries_gdf_allcat = all_countries_gdf_allcat.to_crs(crs_target)

# Convert the 'grd__starttime' column to datetime format
all_countries_gdf_allcat['grd__starttime'] = pd.to_datetime(
    all_countries_gdf_allcat['grd__starttime'])

# Crop oil spills to ROI
# Get the bounds of the raster dataset
bounds = data_no_nan.rio.bounds()

# Clip the oil to the bounds of the raster dataset
all_countries_gdf_allcat_clipped = gpd.clip(all_countries_gdf_allcat, bounds)

Load and crop EEZ layer¶

In [9]:
# Load the shapefile
shapefile_path = "/Users/ryanboarman/Documents/WORK/2023/skytruth/data/shapefiles/Intersect_EEZ_IHO_v4_2020.shp"
shapefile = gpd.read_file(shapefile_path)
# Transform the GeoDataFrame to the target CRS
shapefile = shapefile.to_crs(crs_target)

# Filter rows where 'UNION' is 'Norway' or 'Germany'
shapefile = shapefile[(shapefile['TERRITORY1'] == 'Norway') |
                      (shapefile['TERRITORY1'] == 'Germany') |
                      (shapefile['TERRITORY1'] == 'Finland') |
                      (shapefile['TERRITORY1'] == 'Sweden') |
                      (shapefile['TERRITORY1'] == 'United Kingdom')]

# Dissolve the GeoDataFrame by the "TERRITORY1" column
dissolved_shapefile = shapefile.dissolve(by='TERRITORY1')

# Clip the EEZ to the bounds of the raster dataset
dissolved_shapefile_clipped = gpd.clip(dissolved_shapefile, bounds)

# Calculate the area for each geometry in square kilometers
dissolved_shapefile_clipped['AREA_KM2'] = dissolved_shapefile_clipped['geometry'].area / 1e6

Map of Oil Slicks and EEZ¶

In [10]:
# Create a new map
map = folium.Map(location=[60.4720, 9.4689],
                 zoom_start=4, width="100%", height="100%")
# Convert the 'grd__starttime' column to a string format that can be serialized to JSON
all_countries_gdf_allcat_clipped['grd__starttime'] = (
    all_countries_gdf_allcat_clipped['grd__starttime'].astype(str))

# Define the style function


def style_function(feature):
    """
    Returns a dictionary of style properties for a given GeoJSON feature.

    Returns:
        dict: A dictionary of style properties for the feature. 
            - 'fillColor': A string representing the fill color of the feature.
            - 'color': A string representing the color of the feature outline.
            - 'weight': An integer representing the width of the feature outline.
            - 'fillOpacity': A float representing the opacity of the feature fill.

    """
    return {
        'fillColor': 'red',
        'color': 'red',
        'weight': 2,
        'fillOpacity': 0.5,
    }

# Define style function for the clipped shapefile


def style_function_shapefile(feature):
    return {
        'fillColor': 'grey',
        'color': 'grey',
        'weight': 1,
        'fillOpacity': 0.5,
    }


# Add layers
folium.GeoJson(dissolved_shapefile_clipped, name="EEZ",
               style_function=style_function_shapefile).add_to(map)

folium.GeoJson(all_countries_gdf_allcat_clipped, name="Oil Slicks",
               style_function=style_function).add_to(map)

# Adding LayerControl to toggle layers
folium.LayerControl().add_to(map)

# Show the map
map
Out[10]:
Make this Notebook Trusted to load map: File -> Trust Notebook

The figure shows oil slicks in red and EEZ in grey.

Extract Distribution Statistics from Oil Slicks¶

In [11]:
# Number of Oil Spills
number_oilspills = all_countries_gdf_allcat_clipped['posi_poly__id'].count()
print('The total number of Oil Spills Detected in 2020 are'  f' {number_oilspills}')

# Convert 'grd__starttime' column to datetime type
all_countries_gdf_allcat_clipped['grd__starttime'] = pd.to_datetime(all_countries_gdf_allcat_clipped['grd__starttime'])

# Group by month in 'grd__starttime' column and calculate count of 'posi_poly__id'
result = all_countries_gdf_allcat_clipped.groupby(all_countries_gdf_allcat_clipped['grd__starttime'].dt.month)['posi_poly__id'].count()

# Get month names
month_names = [calendar.month_name[i] for i in result.index]

# Plot the bar graph
plt.bar(month_names, result.values, color='brown')
plt.xlabel('')
plt.ylabel('Number of Oil Spills Detected')
plt.title('North Sea Oil Spills Detected by Month in 2020 ')
plt.xticks(rotation=90)  # Rotate x-axis labels for better readability
plt.show()
The total number of Oil Spills Detected in 2020 are 475

Extract Statistics¶

In [12]:
# Create blank lists for min, max, mean
min_vals = []
max_vals = []
mean_vals = []

# Loop through each geometry in the GeoDataFrame
for i, row in all_countries_gdf_allcat_clipped.iterrows():

    # Initialize min, max, and mean values to NaN
    min_val = np.nan
    max_val = np.nan
    mean_val = np.nan
    try:
        # Clip the raster to the geometry
        clipped = data_no_nan.rio.clip([row.geometry], all_touched=True)

        # Mask out negative values
        clipped = clipped.where(clipped >= 0)

        # Compute the desired statistics for the clipped raster
        min_val = clipped.min().values
        max_val = clipped.max().values
        mean_val = clipped.mean().values

    except rxr.exceptions.NoDataInBounds:
        # If there is no data in the bounds of the geometry, set min, max, and mean values to NaN
        min_val = np.nan
        max_val = np.nan
        mean_val = np.nan

    # Append the min, max, and mean values to their respective lists
    min_vals.append(min_val)
    max_vals.append(max_val)
    mean_vals.append(mean_val)

# Add new columns to the GeoDataFrame with the min, max, and mean values
all_countries_gdf_allcat_clipped['min_val'] = min_vals
all_countries_gdf_allcat_clipped['max_val'] = max_vals
all_countries_gdf_allcat_clipped['mean_val'] = mean_vals

Graph Statistics¶

Oil spills by Exclusive Economic Zone¶

In [13]:
# Calculate the area in square kilometers and store it in the 'area_km2' column
all_countries_gdf_allcat_clipped['area_km2'] = (
    all_countries_gdf_allcat_clipped['geometry'].area / 1e6)

# Group the data by 'eez__geoname' and aggregate the count and sum
table = all_countries_gdf_allcat_clipped.groupby('eez__geoname').agg(
    {'eez__geoname': 'count', 'area_km2': 'sum'})

# Round the 'area_km2' values to one decimal place
table['area_km2'] = table['area_km2'].round(1)

# Rename the columns of the table
table.columns = ['Number of Oil Spills', 'Oil Spill Area (km2)']
table = table.rename_axis('Exclusive Economic Zone')

# Add a new column and fill it with manual values
manual_values = [47904, 324331, 14782, 733788]
table['EEZ Total Area (km2)'] = manual_values

# Add new column for number of spills by EEZ area
table['spills_by_EEZarea'] = table['Number of Oil Spills'] / \
    table['EEZ Total Area (km2)']

# Add new column for number of spills per 100,000 km2
table['spills_per_10k'] = table['spills_by_EEZarea']*10000
In [14]:
# Plot table data
data = {
    'EEZ': ["Swedish EEZ", 'German EEZ', 'Norwegian EEZ', 'UK EEZ'],
    'Oil Spills': [3, 25, 83, 128],
    'Total area (km2)': [3.4, 57.7, 209, 934.5],
    'Number of Spills per 10,000 km2': [2.03, 5.22, 2.56, 4.96]
}

df = pd.DataFrame(data)

# Create a new column in the DataFrame with the desired text
df['Text'] = 'Number of Oil Spills: ' + \
    df['Number of Spills per 10,000 km2'].astype(str)

# Set figure
fig = px.bar(df, x='EEZ', y='Number of Spills per 10,000 km2', color='EEZ', text='Text',
             title='Number of Oil Spills Detected per 10,000 km2 by Exclusive Economic Zones',
             labels={'EEZ': 'Exclusive Economic Zone',
                     'Total area (km2)': 'Total Area (km2)'})

# Disable hover box by setting hovermode to False
fig.update_layout(hovermode=False)

fig.update_layout(showlegend=False)
fig.show()

Table and figure highlight both the number of oil spills and total area of the oil spills in August 2020 by the EEZ. The UK had much higher amounts and total areas of oil spills compared to Norway and German.

Create function to calculate statistics¶

In [15]:
# def calculate_geometry_stats(data_dict, species_id, month, all_countries_gdf_allcat_clipped):
#     """
#     Calculate geometry statistics for a selected array based on species_id and month,
#     and apply the statistics to a GeoDataFrame of clipped geometries.
    
#     Parameters:
#         data_dict (dict): A dictionary of arrays containing the data for different species and months.
#         species_id (str): The ID of the species.
#         month (str): The month for which the statistics are calculated.
#         all_countries_gdf_allcat_clipped (GeoDataFrame): The GeoDataFrame containing the clipped geometries.

#     Returns:
#         GeoDataFrame: A new GeoDataFrame with added columns for the calculated geometry statistics.
#     """
    
#     # Create the key from species_id and month
#     key = f"{species_id}_{month}"
    
#     # Check if the key exists in data_dict
#     if key not in data_dict:
#         raise ValueError(f"No data found for species_id: {species_id}, month: {month}")
    
#     # Get the selected array from data_dict based on the key
#     selected_array = data_dict[key]
    
#     # Filter rows in all_countries_gdf_allcat_clipped based on the month
#     filtered_rows = all_countries_gdf_allcat_clipped.loc[
#         all_countries_gdf_allcat_clipped['grd__starttime'].dt.month == int(month)
#     ].copy()  # Create a copy of the filtered rows
    
#     # Create blank lists for min, max, mean
#     min_vals = []
#     max_vals = []
#     mean_vals = []

#     # Loop through each geometry in the filtered GeoDataFrame
#     for i, row in filtered_rows.iterrows():

#         # Initialize min, max, and mean values to NaN
#         min_val = np.nan
#         max_val = np.nan
#         mean_val = np.nan
#         try:
#             # Clip the raster to the geometry
#             clipped = selected_array.rio.clip([row.geometry], all_touched=True)

#             # Mask out negative values
#             clipped = clipped.where(clipped >= 0)

#             # Compute the desired statistics for the clipped raster
#             min_val = clipped.min().values
#             max_val = clipped.max().values
#             mean_val = clipped.mean().values

#         except rxr.exceptions.NoDataInBounds:
#             # If there is no data in the bounds of the geometry, set min, max, and mean values to NaN
#             min_val = np.nan
#             max_val = np.nan
#             mean_val = np.nan

#         # Append the min, max, and mean values to their respective lists
#         min_vals.append(min_val)
#         max_vals.append(max_val)
#         mean_vals.append(mean_val)

#     # Assign the min, max, and mean values to the copied GeoDataFrame
#     filtered_rows['min_val'] = min_vals
#     filtered_rows['max_val'] = max_vals
#     filtered_rows['mean_val'] = mean_vals
    
#     return filtered_rows

Example of using function¶

In [16]:
result = calculate_geometry_stats(data_dict, "HarbourPorpoise", "08", all_countries_gdf_allcat_clipped)


# Extract the mean_val data for each country

# Make country list
country_list = ['Norwegian Exclusive Economic Zone',
                'United Kingdom Exclusive Economic Zone',
                'German Exclusive Economic Zone',
               'Sweeden Exclusive Economic Zone']
# Make color list
colors = ['red', 'blue', 'green', 'orange', 'purple']

# Groupy by EEZ
data = ([result
         [result['eez__geoname']
          == eez__geoname]['mean_val'] for eez__geoname in country_list])

# Create a histogram plot with customizations
fig, ax = plt.subplots(figsize=(8, 5))
ax.hist(data, bins=8, stacked=True, color=colors[:len(
    country_list)], edgecolor='black', alpha=0.7, label=country_list)

ax.set_title('Harbour Porpoise Density per Oil Spill', fontsize=16)
ax.set_xlabel('Animal density (individuals per km2)', fontsize=14)
ax.set_ylabel('No. of Oil Spills', fontsize=14)

# Customize the appearance of the plot
ax.grid(True, linestyle='-', alpha=0.7)
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.tick_params(axis='both', which='major', labelsize=12)

ax.legend(loc='best', fontsize=10)

plt.show()

Figure shows number of individual oil spills by EEZ and the density of Harbour porpoises effected by the spills.

interactive plot¶

In [17]:
def calculate_geometry_stats(data_dict, species_id, month, all_countries_gdf_allcat_clipped):
    """
    Calculate geometry statistics for a selected array based on species_id and month,
    and apply the statistics to a GeoDataFrame of clipped geometries.
    
    Parameters:
        data_dict (dict): A dictionary of arrays containing the data for different species and months.
        species_id (str): The ID of the species.
        month (str): The month for which the statistics are calculated.
        all_countries_gdf_allcat_clipped (GeoDataFrame): The GeoDataFrame containing the clipped geometries.

    Returns:
        GeoDataFrame: A new GeoDataFrame with added columns for the calculated geometry statistics.
    """
    
    # Create the key from species_id and month
    key = f"{species_id}_{month}"
    
    # Check if the key exists in data_dict
    if key not in data_dict:
        raise ValueError(f"No data found for species_id: {species_id}, month: {month}")
    
    # Get the selected array from data_dict based on the key
    selected_array = data_dict[key]
    
    # Filter rows in all_countries_gdf_allcat_clipped based on the month
    filtered_rows = all_countries_gdf_allcat_clipped.loc[
        all_countries_gdf_allcat_clipped['grd__starttime'].dt.month == int(month)
    ].copy()  # Create a copy of the filtered rows
    
    # Create blank lists for min, max, mean
    min_vals = []
    max_vals = []
    mean_vals = []

    # Loop through each geometry in the filtered GeoDataFrame
    for i, row in filtered_rows.iterrows():

        # Initialize min, max, and mean values to NaN
        min_val = np.nan
        max_val = np.nan
        mean_val = np.nan
        try:
            # Clip the raster to the geometry
            clipped = selected_array.rio.clip([row.geometry], all_touched=True)

            # Mask out negative values
            clipped = clipped.where(clipped >= 0)

            # Compute the desired statistics for the clipped raster
            min_val = clipped.min().values
            max_val = clipped.max().values
            mean_val = clipped.mean().values

        except rxr.exceptions.NoDataInBounds:
            # If there is no data in the bounds of the geometry, set min, max, and mean values to NaN
            min_val = np.nan
            max_val = np.nan
            mean_val = np.nan

        # Append the min, max, and mean values to their respective lists
        min_vals.append(min_val)
        max_vals.append(max_val)
        mean_vals.append(mean_val)

    # Assign the min, max, and mean values to the copied GeoDataFrame
    filtered_rows['min_val'] = min_vals
    filtered_rows['max_val'] = max_vals
    filtered_rows['mean_val'] = mean_vals
    
    return filtered_rows


# Get available species IDs from data_dict keys
species_ids = sorted(
    list(set([k.split("_")[0] for k in data_dict.keys()])))

# Create slider widget for the month
month_slider = widgets.IntSlider(min=1, max=12, value=1, description='Month')

# Create dropdown widget for the species ID
species_id_dropdown = widgets.Dropdown(options=species_ids, description='Species ID')

# Create an interactive plot using the widgets
@interact(month=month_slider, species_id=species_id_dropdown)
def interactive_plot(month, species_id):
    result = calculate_geometry_stats(data_dict, species_id, str(month).zfill(2), all_countries_gdf_allcat_clipped)

    # Extract the mean_val data for each country
    country_list = ['Norwegian Exclusive Economic Zone',
                    'United Kingdom Exclusive Economic Zone',
                    'German Exclusive Economic Zone',
                    'Sweden Exclusive Economic Zone']

    # Group by EEZ
    data = [result[result['eez__geoname'] == eez__geoname]['mean_val'] for eez__geoname in country_list]

    # Create a histogram plot with customizations
    fig, ax = plt.subplots(figsize=(8, 5))
    ax.hist(data, bins=8, stacked=True, color=['red', 'blue', 'green', 'orange'], edgecolor='black',
            alpha=0.7, label=country_list)

    

    ax.set_title(f"{species_id} Density per Oil Spill (Month {month:02d})", fontsize=16)
#     ax.set_title(f"{species_id} Density per Oil Spill", fontsize=16)
    ax.set_xlabel('Animal density (individuals per km2)', fontsize=14)
    ax.set_ylabel('No. of Oil Spills', fontsize=14)

    # Customize the appearance of the plot
    ax.grid(True, linestyle='-', alpha=0.7)
    ax.spines['top'].set_visible(False)
    ax.spines['right'].set_visible(False)
    ax.tick_params(axis='both', which='major', labelsize=12)

    ax.legend(loc='best', fontsize=10)

    plt.show()
interactive(children=(IntSlider(value=1, description='Month', max=12, min=1), Dropdown(description='Species ID…

Conclusion and Discussion¶

In this exploratory analysis, I have successfully demonstrated the potential of incorporating SkyTruth's Oil Spill SAR detection algorithm into a workflow for assessing the impact of oil spills originating from platforms and ships on the surrounding marine wildlife. Throughout August 2020, a total of 171 oil spills were detected from vessels and offshore infrastructure in the North Sea. While these incidents are not considered major oil spills, their cumulative effect on the environment is often underestimated, leading to significant harm to wildlife and ecosystems over time.

A comparative analysis of oil spills in the United Kingdom, Norway, and Germany revealed that the UK experienced the highest number of oil spills, affecting the largest areas. However, when considering the impact on a specific species, such as the Harbour porpoise, the UK was not necessarily the most destructive. Germany, with 10 oil spills covering a total area of 19.4 km2, had a smaller affected area compared to the UK. Nevertheless, these spills occurred in regions with higher densities of Harbour porpoise habitats, suggesting a potentially more significant impact on this species.

This key finding highlights the importance of considering not only the number and extent of oil spills but also their location in relation to specific species' habitats. In the case of the Harbour porpoise, even smaller spills can have considerable consequences on their health and well-being. The integration of SkyTruth's Oil Spill SAR detection algorithm into the workflow allows for a more comprehensive understanding of the effects of oil spills on marine wildlife, enabling more effective conservation and management strategies.

Future Research and Next Steps¶

The present study serves as a preliminary use case for a more comprehensive tool I plan to develop. Utilizing one month of data and focusing on a single species, I was able to validate the workflow and obtain intriguing findings. Building upon these initial results, I will expand the scope of the research to incorporate oil spill data from the entire year (January through December 2020) and examine the effects on 12 marine mammal species' distributions on a monthly basis.

This enhanced tool will provide valuable insights into the direct impact of small oil spills from offshore infrastructure and vessels in the North Sea on the habitats of 12 marine mammal species. By broadening the dataset and considering a wider range of species, the refined tool will contribute to a more accurate understanding of the complex interplay between oil spills and marine ecosystems, as well as inform more effective conservation and management strategies.

Future research could also explore the integration of additional data sources, such as oceanographic and meteorological parameters, to better account for environmental conditions that may influence the dispersal and impact of oil spills. Moreover, expanding the geographical scope of the study and applying the developed tool to other regions would enhance the generalizability and applicability of my findings, ultimately contributing to the global efforts in protecting marine wildlife from the detrimental effects of oil spills.

Create a .html file of the notebook¶

In [18]:
%%bash
jupyter nbconvert --to html Boarman_Capstone2023-v1.2.ipynb
[NbConvertApp] Converting notebook Boarman_Capstone2023-v1.2.ipynb to html
[NbConvertApp] Writing 777741 bytes to Boarman_Capstone2023-v1.2.html